﻿
/*
 * 名称：动态表格-独立输入版
 * 作者：黄平显
 * 创建日期：2009-2-12
 * 说明：使用本表格框架后，只用在输入控件上和表格数据列设置相同dname属性,就可实现随意增加或删除表格的行，
 *      并可将全表中的值保存在一个hidden控件中,并且支持删除添加的前后事件
 * 使用说明：见DEMO.aspx,平台使用实践请参见 CGNPC/FICO/ContractPayment/ContractPayment.aspx
 * 修改历史：
 * 参数:
 *  dataTableID     : 数据列表区的ID
 *  inputTableID    : 数据输入区的ID
 *  addBtnID        : 添加按钮的ID
 *  hiddenID        : 数据存储域
 *
 * 事件:
 *       DnmcTableInput.BeforeAdd       :插入前
 *       DnmcTableInput.AfterAdd        :插入后
 *       DnmcTableInput.BeforeDelete    :删除前
 *       DnmcTableInput.AfterDelete     :删除后
 *       DnmcTableInput.BeforeSeri      :序列化(存值)前
 *       DnmcTableInput.AfterSeri       :序列化(存值)后
 *       DnmcTableInput.BeforeDeSeri    :构建表格前
 *       DnmcTableInput.AfterDeSeri     :构建表格后
 */
function DnmcTableInput(  dataTableID , inputTableID , addBtnID , hiddenID) {

    this.DataTableID    = "#" + dataTableID ;
    this.InputTableID   = "#" + inputTableID;
    this.AddBtnID       = "#" + addBtnID; 
    this.HiddenID       = "#" + hiddenID;

    //向动态表格中添加一行
    DnmcTableInput.prototype.Add = function() {
        //添加前事件
        if ( DnmcTableInput.BeforeAdd != null )
        {
            //只有返回false才中断,如果返回undefined就放过去
            if ( DnmcTableInput.BeforeAdd(this) == false )
            {
                return false;
            }
        }

        //构建凭证数据到vals对象vals[dname] = value
        var vals= new Object();
        $(this.InputTableID + " [dname]").each(
            function(){ 
                var c = $(this);
                vals[c.attr("dname")] = c.val();
            }
        );
        //构建插入到凭证行
        var tr = $(this.DataTableID + " tr[dname='tmplt']:first").clone(true);
        tr.attr("dname","dataRow");
        tr.find("td").each(function(){
            var td = $(this);
            if ( td.attr("dname") != "Operation" )
            {
                td.text(vals[td.attr("dname")] 
                + " " //占位符,以免出现表格边线缺失
                );
            }
        });
        tr.show();
        //插入到模板行之后
        $(this.DataTableID  + " tr[dname='tmplt']:first").after(tr);
        
        //添加后事件
        if ( DnmcTableInput.AfterAdd != null )
        {
            DnmcTableInput.AfterAdd(this) ;
        }
    };

    //将动态表格中的控件序列化为一个XML值
    DnmcTableInput.prototype.Serialize = function() {
        //序列化前事件
        if ( DnmcTableInput.BeforeSeri != null )
        {
            //只有返回false才中断,如果返回undefined就放过去
            if ( DnmcTableInput.BeforeSeri(this) == false )
            {
                return false;
            }
        }
    
        //读取所有的dname='dataRow'的行,然后取值
        var rows=$(this.DataTableID + " tr[dname='dataRow']");
        if (rows.length<1) 
        {
            $(this.HiddenID).val("");
        }
        else
        {
            var s = "<xml>";
            rows.each(function() {
                var tr = $(this);
                s +="<row>";
                tr.find("td").each(function(){
                    var td = $(this);
                    //如果是操作列,跳过取值
                    if ( td.attr("dname") != "Operation" )
                    {
                        s += "<" + td.attr("dName") + ">" 
                        + $.trim( td.text().replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;")) 
                        + "</" + td.attr("dName") + ">";
                    }
                });
                s +="</row>";
            });
            s += "</xml>";
            $(this.HiddenID).val(s);
        }
        
        //序列化后事件
        if ( DnmcTableInput.AfterSeri != null )
        {
            DnmcTableInput.AfterSeri(this) ;
        }
    };

    //将XML字符串反序列化为动态表格中的控件并设置值
    DnmcTableInput.prototype.DeSerialize = function() {
        //构建表格前事件
        if ( DnmcTableInput.BeforeDeSeri != null )
        {
            //只有返回false才中断,如果返回undefined就放过去
            if ( DnmcTableInput.BeforeDeSeri(this) == false )
            {
                return false;
            }
        }
        
        $(this.DataTableID + " tr[dname='dataRow']").each(function(){$(this).remove();});
        var rows=$.xml2json($(this.HiddenID).val());
        if(rows != undefined && rows.row != undefined )
        {
            var ary ;
            if ( rows.row.length == undefined )
            {
                //当只有一行记录时
                ary = new Array(1);
                ary[0] = rows.row;
            }
            else
            {
                ary = rows.row;
            }
            for(var i=ary.length-1;i>=0; i--){
                var tr = $(this.DataTableID + " tr[dname='tmplt']:first").clone(true);
                tr.attr("dname","dataRow");
                tr.find("td").each(function(){
                    var td = $(this);
                    //如果是操作列,跳过赋值
                    if ( td.attr("dname") != "Operation" )
                    {
                        td.text(ary[i][td.attr("dname")] 
                        + " " //占位符,以免出现表格边线缺失
                        );
                    }
                });
                tr.show();
                //插入到模板行之后
                $(this.DataTableID + " tr[dname='tmplt']:first").after(tr);
            }
        }
        
        //构建表格后事件
        if ( DnmcTableInput.AfterDeSeri != null )
        {
            DnmcTableInput.AfterDeSeri(this) ;
        }
    };

}

//初始化动态表格
DnmcTableInput.Ini = function (dnmcTableInput){
    $(dnmcTableInput.AddBtnID).bind("click",function(){dnmcTableInput.Add();});
    dnmcTableInput.DeSerialize();
};

//删除[删除按钮]所在行
DnmcTableInput.Delete1Row = function(sender){
    //删除前事件
    if ( DnmcTableInput.BeforeDelete != null )
    {
        //只有返回false才中断,如果返回undefined就放过去
        if ( DnmcTableInput.BeforeDelete(sender) == false )
        {
            return false;
        }
    }

    $(sender).attr("id","deletingRow");
    $("tr:has(#deletingRow):last").remove();

    //删除后事件
    if ( DnmcTableInput.AfterDelete != null )
    {
        DnmcTableInput.AfterDelete(sender);
    }
};